package com.wh.wisdomsite.xbox.common.error;

import org.apache.commons.logging.Log;
import org.apache.commons.logging.LogFactory;
import org.springframework.context.NoSuchMessageException;
import org.springframework.context.support.MessageSourceAccessor;
import java.util.Locale;

/**
 * 自定义主错误集合对象
 * @Package com.wh.wisdomsite.xbox.common.error
 * @author 谢泽鹏
 * @date 2014年10月8日 下午4:02:14
 * @Copyright 个人版权所有
 * @Company 贵州万华科技有限公司Copyright (c) 2014
 * @version V1.0
 */
public class MainErrors {

    private static final Log logger = LogFactory.getLog(MainErrors.class);

    //spring错误消息MessageSourceAccessor
    private static MessageSourceAccessor messageSourceAccessor;

    //前缀
    private final static String ERROR_CODE_PREFIX = "ERROR_";

    //后缀
    private final static String ERROR_SOLUTION_SUBFIX = "_SOLUTION";


    /**
     * 根据主错误类型和语言,创建主错误描述
     * @param mainErrorType
     * @param locale
     * @return
     */
    public static MainError getMainError(MainErrorType mainErrorType, Locale locale) {
        //获取错误消息
        String errorMessage = getErrorMessage(ERROR_CODE_PREFIX + mainErrorType.value(), locale);
        //获取错误语言消息
        String solutionMessage = getErrorSolution(ERROR_CODE_PREFIX + mainErrorType.value() + ERROR_SOLUTION_SUBFIX, locale);
        //创建MainError对象
        return new MainError(mainErrorType.value(), errorMessage, solutionMessage);
    }




    /**
     * 获取错误消息
     * @param code
     * @param locale
     * @return
     */
    private static String getErrorMessage(String code, Locale locale) {
        try {
            return messageSourceAccessor.getMessage(code, new Object[]{}, locale);
        } catch (NoSuchMessageException e) {
            e.printStackTrace();
            logger.error("getErrorMessage->>找不到对应的KEY: " + code);
            throw e;
        }
    }


    /**
     * 获取错误语言消息
     * @param code
     * @param locale
     * @return
     */
    private static String getErrorSolution(String code, Locale locale) {
        try {
            return messageSourceAccessor.getMessage(code, new Object[]{}, locale);
        } catch (NoSuchMessageException e) {
            e.printStackTrace();
            logger.error("getErrorSolution->>找不到对应的KEY: " + code);
            throw e;
        }
    }


    /**
     * 提供set方法
     * @param errorMessageSourceAccessor
     */
    public static void setMessageSourceAccessor(MessageSourceAccessor errorMessageSourceAccessor) {
        MainErrors.messageSourceAccessor = errorMessageSourceAccessor;
    }

}
